ACL無効化を解除したS3バケットをCloudFormationで作成してみた (CloudFrontアクセスログ出力用)
CloudFrontの標準アクセスログ保存先としてS3を利用する場合、2023年6月現在 S3バケットのACL設定が必要です。
2023年4月のS3の仕様変更により、新規作成したS3バケットは デフォルトで ACLの無効化設定が反映されるようになった事で、 CloudFormationを利用した S3バケットのACL「LogDeliveryWrite」の反映時、エラーが発生するようになりました。
- Bucket cannot have ACLs set with ObjectOwnerships BucketOwnerEnforced setting
今回、CloudFormation を利用して、 S3バケット のデフォルトACL無効化を解除し、 CloudFrontの標準アクセスログ保存に必要なACL設定を行う機会がありましたので、紹介させて頂きます。
S3バケット設定
「OwnershipControls」以下のルール「ObjectOwnership: BucketOwnerPreferred」を追加。 2023年3月以前のデフォルト、ACL無効化をキャンセルする指定をしました。
Resources: AccesslogBucket: Type: AWS::S3::Bucket Properties: OwnershipControls: Rules: - ObjectOwnership: BucketOwnerPreferred AccessControl: LogDeliveryWrite
設定例
CloudFrontのS3へのログ出力指定、CloudFormationで実施するサンプルです。
AWSTemplateFormatVersion: '2010-09-09' Description: CloudFront and S3 (access logs for CloudFront) Resources: S3BucketAccesslogs: Type: AWS::S3::Bucket Properties: OwnershipControls: Rules: - ObjectOwnership: BucketOwnerPreferred AccessControl: LogDeliveryWrite BucketName: !Sub '${AWS::StackName}-accesslogs-${AWS::Region}-${AWS::AccountId}' LifecycleConfiguration: Rules: - Id: AutoDelete Status: Enabled ExpirationInDays: 15 CloudFrontDistribution: Type: AWS::CloudFront::Distribution Properties: DistributionConfig: Origins: - Id: CustomOrigin DomainName: 'www.example.com' CustomOriginConfig: HTTPPort: 80 OriginProtocolPolicy: http-only Enabled: true Logging: IncludeCookies: 'false' Bucket: !Sub '${S3BucketAccesslogs}.s3-${AWS::Region}.amazonaws.com' Prefix: !Sub '${AWS::StackName}/cloudfront/' Comment: !Sub '${AWS::StackName}' DefaultCacheBehavior: TargetOriginId: CustomOrigin ForwardedValues: QueryString: false DefaultTTL: 300 MaxTTL: 300 MinTTL: 300 ViewerProtocolPolicy: redirect-to-https
まとめ
2023年3月以前に作成された CloudFormation テンプレート を再利用して、CloudFrontアクセスログ用のS3バケットを設置する場合、 今回紹介した設定追加をお試しください。
なお、ACLの設定ミスなどによるリスク軽減のため、CloudFrontのアクセスログ用として ACLを有効化した S3バケットは CloudFrontのログ保存専用として利用する事をおすすめします。
また、CloudFrontのアクセスログファイルに対する、不適切なACL反映を避ける必要がある場合、 下記AWSブログで紹介されている Lambda などを利用して、別のS3バケットにログファイルを移動させる事もご検討ください。